package com.shujia.day12;

import java.io.*;
import java.util.ArrayList;

public class Demo15IOObject {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        /*
            序列化流
                ObjectOutputStream
            反序列化流
                ObjectInputStream
             序列化及反序列化：
                数据在内存中是以01010形式存在的，那么数据要写到磁盘中，那么需要将0101的数据序列化成可识别的字节数据
                    如果将磁盘中的数据直接读取成内存中可以识别的对象，那么需要对数据进行反序列化
                对象 =序列化=> 磁盘数据( ~     t 理科四班t 女t ) =反序列化=> 对象
         */

        String path = "data/students.txt";
        BufferedReader bufferedReader = new BufferedReader(new FileReader(path));
        String line = "";
        ArrayList<Student> list = new ArrayList<>();
        while ((line = bufferedReader.readLine()) != null) {
            // TODO 当读取到的一行数据其不为null的情况下 可以对该行数据进行处理
            String[] columns = line.split(",");
            list.add(new Student(columns[0], columns[1], Integer.valueOf(columns[2]), columns[3], columns[4]));
        }
        // TODO 上述代码已经获取到了每一个学生的对象  => 如果想要将对象的数据保存下来

//        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("data/stuObj.txt"));
//        for (Student student : list) {
//            bufferedWriter.write(student.toString());
//            bufferedWriter.newLine();
//        }
//        bufferedWriter.close();

        // 对于对象的读写操作可以使用 序列化和反序列化流
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("data/stuObj.txt"));
        for (Student student : list) {
            /*
                没有序列化异常
                java.io.NotSerializableException: com.shujia.day12.Student
                    对于数据必须要实现 Serializable 接口
             */
            outputStream.writeObject(student);
        }
        outputStream.close();


        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("data/stuObj.txt"));

        // 读取到一个数据
//        Object stu = objectInputStream.readObject();
//        if (stu instanceof Student){
//            System.out.println(stu);
//        }

        // 读取所有数据
        Object stu = null;
        while ((stu = objectInputStream.readObject()) != null) {
            if (stu instanceof Student) {
                System.out.println(stu);
            }
        }


    }
}
